﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _01练习题
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 1.	声明两个变量：int n1 = 10, n2 = 20;要求将两个变量交换，最后输出n1为20,n2为10。
            //int n1 = 10, n2 = 20;
            //int temp = n1;
            //n1 = n2;
            //n2 = temp;

            //Console.WriteLine("n1 = {0},n2 = {1}", n1, n2);
            //Console.ReadKey();

            //交换两个变量，不适用第三个变量
            //int n1 = 10, n2 = 20;
            //n1 = n1 + n2;
            //n2 = n1 - n2;
            //n1 = n1 - n2;
            //Console.WriteLine("n1={0},n2={1}");
            //Console.ReadKey();

            //int n1 = 10, n2 = 20;
            //n2 = n1 + (n1 = n2) * 0;
            //Console.WriteLine("n1={0},n2={1}",n1,n2);
            //Console.ReadKey();






            #endregion
            #region 交换两个变量，封装成方法

            //int n1 = 10, n2 = 20;
            //Swap(ref n1, ref n2);

            //Console.WriteLine("n1={0},n2={1}", n1, n2);
            //Console.ReadKey();


            #endregion

            #region 通过编程计算1+2-3+4-5+6-7.。。。100的值
            //int sum = 0;
            ////循环1-100的每个数字
            //for (int i = 1; i <= 100; i++)
            //{
            //    if (i == 1 || i %2 == 0)
            //    {
            //        sum += i;
            //    }
            //    else
            //    {
            //        //奇数
            //        sum += (i * -1);
            //    }
                
            //}
            //Console.WriteLine(sum);
            //Console.ReadKey();

            #endregion

            #region 请用户输入一个字符串，计算字符串中字符个数，并输出。

            //string msg = "你好a!中国";
            ////字符串的Length属性表示字符串中字符个数，无论中文字符还是英文字符，一个字符就是一个字符，不是字节个数
            //Console.WriteLine(msg.Length);
            //Console.ReadKey();

            #endregion

            #region 4.	用方法来实现：计算两个数的最大值。思考：方法的参数？返回值？扩展（*）：计算任意多个数间的最大值（提示：params）。
            //定义方法要职责单一的方法，不要画蛇添足！！！方法只做对应的处理，保证任何地方都可以调用这个方法
            //Console.WriteLine("请输入一个数字：");
            //int n1 = Convert.ToInt32(Console.ReadLine());
            //Console.WriteLine("在输入一个数字：");
            //int n2 = Convert.ToInt32(Console.ReadLine());
            //int max = GetMaxValue(n1, n2);
            //Console.WriteLine("最大值是：{0}",max);
            //Console.ReadKey();

            //int max = GetMaxValue(10, 100, 200, 54, 954545, 212);
            //Console.WriteLine("最大值是：{0}", max);
            //Console.ReadKey();
            #endregion
            #region 计算1-100之间所有整数的和
            //int sum = 0;
            //for (int i = 1; i <= 100; i++)
            //{
            //    sum += i;
            //}
            //Console.WriteLine("1-100的和是：{0}", sum);
            //Console.ReadKey();
            #endregion

            #region 计算1-100之间的所有奇数的和
            //int sum = 0;
            //for (int i = 1; i <= 100; i++)
            //{
            //    if (i%2!=0)
            //    {
            //        sum += i;
            //    }
            //}
            //Console.WriteLine("1-100奇数的和：{0}", sum);
            //Console.ReadKey();
            #endregion

            #region 判断一个数是否是质数
            //while (true)
            //{
            //    Console.WriteLine("请输入一个整数：");
            //    int n = Convert.ToInt32(Console.ReadLine());
            //    //shift+alt+f10
            //    //ctrl+.
            //    bool b = IsPrimeNumber(n);

            //    Console.WriteLine(b);
            //}
            #endregion

            #region 计算1-100之间的所有质数（素数）的和
            //int sum = 0;
            //for (int i = 2; i <= 100; i++)
            //{
            //    //对于每个数字判断是否是一个质数
            //    if (IsPrimeNumber(i))
            //    {
            //        sum += i;
            //    }
            //}
            //Console.WriteLine(sum);
            //Console.ReadKey();
            #endregion

            #region 有一个整数数组：{ 1, 3, 5, 7, 90, 2, 4, 6, 8, 10 },找出其中最大值，并输出。不能调用数组的Max()方法。
            //int[] arrNumber = { 1, 3, 5, 7, 90, 2, 4, 6, 8, 10 };

            //int max = GetMaxValueFromArray(arrNumber);

            //Console.WriteLine(max);
            //Console.ReadKey();

            #endregion
            #region 有一个字符串数组：{ "马龙", "迈克尔乔丹", "雷吉米勒", "蒂姆邓肯", "科比布莱恩特" },请输出最长的字符串。
            //string[] name = new string[] { "马龙", "迈克尔乔丹", "雷吉米勒", "蒂姆邓肯", "科比布莱恩特" };
            //string userName = GetLongestName(name);
            //Console.WriteLine(userName);
            //Console.ReadKey();


            #endregion
            #region 请计算出一个整型数组的平均值。{ 1, 3, 5, 7, 90, 2, 4, 6, 8, 10 }。要求：计算结果如果有小数，则显示小数点后两位（四舍五入）。

            //int[] arrInt = { 1, 3, 5, 7, 90, 2, 4, 6, 8, 10 };
            //double avg = GetAvgFromArray(arrInt);
            ////在msdn中搜索“复合格式”
            //Console.WriteLine("平均值是：{0:F}", avg);
            //Console.ReadKey();
            #endregion
            #region 通过冒泡排序法对整数数组{ 1, 3, 5, 7, 90, 2, 4, 6, 8, 10 }实现升序排序。

            //int[] arrInt = { 1, 3, 5, 7, 90, 2, 4, 6, 8, 10 };

            //冒泡排序   这里可以不用写返回值的，因为数组是引用类型的变量
            //MySort(arrInt);

            //for (int i = 0; i < arrInt.Length; i++)
            //{
            //    Console.WriteLine(arrInt[i]);
            //}
            #endregion

            #region 十进制抓换成二进制

            //while (true)
            //{
            //    Console.WriteLine("请输入一个十进制的数字:");
            //    int num = Convert.ToInt32(Console.ReadLine());
            //    //根据十进制数字，返回一个二进制表示的字符串
            //    string result = GetBinaryNumber(num);
            //    Console.WriteLine(result);
            //    Console.ReadKey();
            //}
            #endregion

            #region 判断闰年：1》能被4整除，但是不能被100整除；2》能被400整除
            //while (true)
            //{
            //    Console.WriteLine("请输入一个年份：");
            //    int year = Convert.ToInt32(Console.ReadLine());
            //    bool b = IsLeapYear(year);
            //    Console.WriteLine(b);
            //}
            #endregion

            #region 控制台输出乘法口诀表

            //for (int i = 1; i <= 9; i++)
            //{
            //    //当前i是多少，那么内部这个循环就循环多少次
            //    for (int j = 1; j <= i; j++)
            //    {
            //        Console.Write("{0}*{1}={2}\t",j,i,j*i);
            //    }
            //    Console.WriteLine();
            //}
            //Console.ReadKey();

            #endregion

            #region 自己编写一个函数，实现。net中Trim（）函数的功能，去掉字符串两端的空格

            //string msg = "       你   好   吗？        ";
            //Console.WriteLine("========" + MyTrim(msg) + "==========");
            //Console.ReadKey();
            #endregion

            #region 随机生成10个1-100之间的不重复的偶数，填充到List<int>集合中
            //List<int> list = new List<int>();
            ////默认不写参数，就以当前时间为种子生成随机数，如果种子相同，那么生成的随机数也是相同的
            //Random random = new Random();

            //int index = 0;
            //while (list.Count < 10)
            //{
            //    //随机生成一个1-100之间的数字
            //    int num = random.Next(1, 101);
            //    if(num%2==0 && !list.Contains(num))
            //    {
            //        list.Add(num);
            //    }
            //    index++;
            //}
            ////输出集合中的内容
            //for (int i = 0; i < list.Count; i++)
            //{
            //    Console.WriteLine(list[i]);
            //}
            //Console.WriteLine("============");
            //Console.WriteLine(index);
            //Console.ReadKey();

            ////测试随机数  种子一样，生成的随机数是一样的  所以不要在循环里面使用Random
            //Random random = new Random(98765);
            //for (int i = 0; i < 20; i++)
            //{
            //    int n = random.Next(1, 101);
            //    Console.WriteLine(n);
            //}
            //Console.ReadKey();


            #endregion

            #region 13.	有如下字符串：【"患者：“大夫，我咳嗽得很重。”     大夫：“你多大年记？”     患者：“七十五岁。”     大夫：“二十岁咳嗽吗”患者：“不咳嗽。”     大夫：“四十岁时咳嗽吗？”     患者：“也不咳嗽。”     大夫：“那现在不咳嗽，还要等到什么时咳嗽？”"】。需求：①请统计出该字符中“咳嗽”二字的出现次数，以及每次“咳嗽”出现的索引位置。②扩展（*）：统计出每个字符的出现次数。

            //string msg = "患者：“大夫，我咳嗽得很重。”     大夫：“你多大年记？”     患者：“七十五岁。”     大夫：“二十岁咳嗽吗”患者：“不咳嗽。”     大夫：“四十岁时咳嗽吗？”     患者：“也不咳嗽。”     大夫：“那现在不咳嗽，还要等到什么时咳嗽？”";
            ////统计“咳嗽”出现的次数
            ////思路：
            ////使用IndexOf（），该方法返回在整个字符串中，制定的字符或字符串第一次出现的索引位置，没有找到制定的字符或者字符串则返回-1
            //string word = "咳嗽";
            //int index = 0;//记录索引
            //int count = 1;
            //while ((index = msg.IndexOf(word,index))!= -1)
            //{
            //    count++;
            //    Console.WriteLine("第{0}次出现【咳嗽】，出现的索引位置：{1}",count,index);
            //    //下次查找的时候要从上一次找到的【咳嗽】的索引位置加上”咳嗽“这个字符串的length，从该新索引之后开始继续查找是否有【咳嗽】出现。
            //    index = index + word.Length;
            //}



            #endregion
            #region 14.	将字符串"  hello      world,你  好 世界   !    "两端空格去掉，并且将其中的所有其他空格都替换成一个空格，输出结果为："hello world,你 好 世界 !"。
            //string msg = "  hello      world,你  好 世界   !    ";
            //msg = msg.Trim();
            ////使用split
            //string[] result = msg.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

            ////把result字符串数组中的每个字符使用‘’连接起来
            //string str = string.Join(" ", result);
            //Console.WriteLine(str);
            //Console.ReadKey();



            #endregion

        }

        //模拟Trim（）去掉字符串两端的空白字符
        private static string MyTrim(string msg)
        {
            int start = 0;
            int end = msg.Length - 1;
            //寻找第一个鄙视空白符的字符的索引，并保存到start变量中
            while (start < msg.Length)
            {
                if (!char.IsWhiteSpace (msg[start]))
                {
                    break;
                }
                start++;
            }

            //计算最后一个不是空白符的索引
            while (end >= start)
            {
                if (!char.IsWhiteSpace(msg[end]))
                {
                    break;
                }
                end--;
            }

            return msg.Substring(start, end - start + 1);
        }

        //判断平年闰年
        private static bool IsLeapYear(int year)
        {
            if ((year % 4 ==0) && (year % 100 != 0) || year % 400 ==0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private static string GetBinaryNumber(int num)
        {
            //拼接字符串StringBuilder
            List<string> list = new List<string>();
            while (num >= 2)
            {
                //商
                int shang = num / 2;
                //余数
                int yushu = num % 2;
                list.Add(yushu.ToString());
                //把本次计算的商赋值给num变量
                num = shang;
            }
            list.Add(num.ToString());
            list.Reverse();
            return string.Join("",list.ToArray());

            


        }
        //冒泡排序
        private static void MySort(int[] arrInt)
        {
           //外城循环条件是比较的轮数，相邻的两个数比较要比较多少轮
            for (int i = 0; i < arrInt.Length - 1; i++)
            {
                //这个循环是用来进行相邻两两比较的，从索引最后一个开始与前一个比较
                for (int j = arrInt.Length - 1; j > i; j--)
                {
                    //这是升序排序，改成大于号就变成了降序排序
                    if (arrInt[j] < arrInt[j-1])
                    {
                        int tmp = arrInt[j];
                        arrInt[j] = arrInt[j - 1];
                        arrInt[j - 1] = tmp;
                    }
                }
            }
        }

        private static double GetAvgFromArray(int[] arrInt)
        {
            int sum = 0;
            for (int i = 0; i < arrInt.Length; i++)
            {
                sum += arrInt[i];
            }
            //Math.Round()对数字执行四舍五入
            return Math.Round(sum * 1.0 / arrInt.Length, 2);
        }

        private static string GetLongestName(string[] name)
        {
            string longName = name[0];
            for (int i = 1; i < name.Length; i++)
            {
                if (name[i].Length > longName.Length)
                {
                    longName = name[i];
                }
            }
            return longName;
        }

        private static int GetMaxValueFromArray(int[] arrNumber)
        {
            int max = arrNumber[0];
            for (int i = 1; i < arrNumber.Length; i++)
            {
                if (max < arrNumber[i])
                {
                    max = arrNumber[i];
                }
            }
            return max;
        }

        private static bool IsPrimeNumber(int n)
        {
            if (n>1)
            {
                //Math.Sqrt();//开平方
                //循环判断除了1与n本身意外，小于n的其他自然数中是否还有其他数字可以被整除
                for (int i = 2; i < n; i++)
                {
                    if (n%i==0)
                    {
                        return false;
                    }
                }
                return true;
            }
            else
            {
                throw new NotImplementedException("数字小于1不是质数！");
            }
            
        }

        //任意多个参数比较
        static int GetMaxValue(params int[] nums)
        {
            //对数组nums中的元素求最大值
            int max = nums[0];
            for (int i = 1; i < nums.Length; i++)
            {
                if (nums[i] > max)
                {
                    max = nums[i];
                }
            }
            return max;
        }
        static int GetMaxValue(int n1,int n2)
        {
            return n1 > n2 ? n1 : n2;
        }

        private static void Swap(ref int n1, ref int n2)
        {
            int tmp = n1;
            n1 = n2;
            n2 = tmp;
        }
    }
}
